package com.ljb.android.comm.utils;

import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;


import com.ljb.android.comm.BuildConfig;

import org.jetbrains.annotations.NotNull;

import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 判断一些url的方法
 *
 * @author gong
 */
public class UrlUtils {

    /**
     * 拼接新的Url, 在这个方法里，可以不用在乎是否/
     *
     * @param domain 域名
     * @param file   目录
     * @return
     */
    public static String newUrl(String domain, String file) {
        if (TextUtils.isEmpty(domain)) {
            return file;
        }
        if (TextUtils.isEmpty(file)) {
            return domain;
        }

        if (domain.endsWith("/")) {
            domain = domain.substring(0, domain.length() - 1);
        }

        if (file.startsWith("/")) {
            file = file.substring(1, file.length());
        }

        return domain + "/" + file;
    }


    /**
     * 推荐使用addReplaceParam
     * 为url增加参数
     *
     * @param url
     * @param param 参数
     * @return
     */
    @Deprecated
    public static String addParam(String url, String param) {
        if (TextUtils.isEmpty(url)) {
            return null;
        }
        if (!url.contains(param)) {
            if (url.contains("?")) {
                url = url + "&" + param;
            } else {
                url = url + "?" + param;
            }
        }
        return url;
    }

    /**
     * 清除Url尾部的&
     *
     * @param url
     * @return
     */
    public static String clearUrl(String url) {
        if (url.endsWith("&")) {
            url = url.substring(0, url.length() - 1);
        }
        return url;
    }

    /**
     * 清除Url尾部的/
     *
     * @param url
     * @return
     */
    public static String deleteLastSlash(String url) {
        if (TextUtils.isEmpty(url) || !url.endsWith("/")) {
            return url;
        }
        return url.substring(0, url.length() - 1);
    }

    /**
     * 为url去掉固定条件的param
     *
     * @param url
     * @return
     */
    public static String removeParam(String url, String param) {
        if (url.contains(param)) {
            if (url.contains("?" + param + "&")) {
                url = url.replace(param + "&", "");
            } else if (url.contains("?" + param)) {
                url = url.replace("?" + param, "");
            } else {
                url = url.replace("&" + param, "");
            }
        }
        return url;
    }

    /**
     * 为url增加参数如果有则替换
     *
     * @param url
     * @param param 参数
     * @return
     */
    public static String addReplaceParam(String url, String param) {
        if (TextUtils.isEmpty(url)) return "";
        if (!TextUtils.isEmpty(param)) {// param 为空，直接返回
            String params[] = param.split("=");
            if (params.length > 1) {
                String key = params[0];
                String orgParam = getUrlParam(url, key);// 以前的参数
                if (!TextUtils.isEmpty(orgParam)) {
                    if (orgParam.equals(params[1])) {// 以前的参数和现在替换的参数一直
                        return url;
                    }
                }
                url = removeUrlParam(url, key);
            }
            url = addParam(url, param);
        }
        return url;
    }

    /**
     * 获取url上某一个参数的值
     *
     * @param url
     * @param key url上需要获取其值的参数
     * @return
     */
    public static String getUrlParam(String url, String key) {
        String res = null;
        if (url != null && url.indexOf("?") > 0) {
            Uri uri = Uri.parse(url);
            res = uri.getQueryParameter(key);
        }
        return res;
    }

    /**
     * 删除url上某一个参数的值
     *
     * @param url
     * @param key url上需要获取其值的参数
     * @return
     */
    public static String removeUrlAnyParam(String url, String key) {
        if (!TextUtils.isEmpty(url)) {
            int index = url.indexOf(key + "=");
            if (index != -1) {
                StringBuilder sb = new StringBuilder();
                sb.append(url.substring(0, index));
                int idx = url.indexOf("&", index);
                if (idx != -1) {
                    sb.append(url.substring(idx + 1));
                }
                url = sb.toString();
            }
        }
        return url;
    }


    /**
     * 根据url上的一个参数来删除url上有关这个参数的单元
     * 先获取该参数对应的值，然后将这个参数单元移除
     *
     * @param url
     * @param key
     * @return
     */
    public static String removeUrlParam(String url, String key) {
        String keyValue = getUrlParam(url, key);
        if (TextUtils.isEmpty(keyValue)) {
            return url;
        }
        StringBuffer sbu = new StringBuffer().append(key).append("=").append(keyValue);
        return removeParam(url, sbu.toString().trim());
    }

    /**
     * 根据url上的一个参数(encode)来删除url上有关这个参数的单元
     * 先获取该参数对应的值，然后将这个参数单元移除
     *
     * @param url
     * @param key
     * @return
     */
    public static String removeUrlEncodeParam(String url, String key) {
        if (TextUtils.isEmpty(getUrlParam(url, key))) {
            return url;
        }
        String keyValue = URLEncoder.encode(getUrlParam(url, key));
        StringBuffer sbu = new StringBuffer().append(key).append("=").append(keyValue);
        return removeParam(url, sbu.toString().trim());
    }

    public static Bundle parseUrl(String url) {
        url = url.replace("weiboconnect", "http");
        try {
            URL u = new URL(url);
            Bundle b = decodeUrl(u.getQuery());
            b.putAll(decodeUrl(u.getRef()));
            return b;
        } catch (MalformedURLException e) {
            return new Bundle();
        }
    }

    public static Bundle decodeUrl(String s) {
        Bundle params = new Bundle();
        if (s != null) {
            String array[] = s.split("&");
            for (String parameter : array) {
                String v[] = parameter.split("=");
                params.putString(URLDecoder.decode(v[0]), URLDecoder.decode(v[1]));
            }
        }
        return params;
    }

    /**
     * 构造url
     *
     * @param url     原始url
     * @param showpic 是否拼接图文浏览模式参数，
     *                <true表示拼接showpic=1,表示显示图片>
     *                <false表示拼接showpic=0,表示不显示图片>
     * @return
     */
    public static String formatShowPicUrl(String url, boolean showpic) {
        String pageUrl = url;
        if (!pageUrl.contains("showpic")) {
            if (showpic) {
                pageUrl = UrlUtils.addParam(pageUrl, "showpic=1");
            } else {
                pageUrl = UrlUtils.addParam(pageUrl, "showpic=0");
            }
        }
        pageUrl = UrlUtils.clearUrl(pageUrl);
        return pageUrl;
    }

    /**
     * 构造url
     *
     * @param url          原始url
     * @param isDetailSlid 是否拼接详情页上下翻页的参数，
     *                     <true表示拼接pager=1,表示翻页>
     *                     <false表示拼接pager=0,表示不翻页>
     * @return
     */
    public static String formatSlidUrl(String url, boolean isDetailSlid) {
        String pageUrl = url;
        if (isDetailSlid) {
            pageUrl = UrlUtils.addReplaceParam(pageUrl, "pager=1");
        } else {
            pageUrl = UrlUtils.addReplaceParam(pageUrl, "pager=0");
        }
        pageUrl = UrlUtils.clearUrl(pageUrl);
        return pageUrl;
    }

    public static boolean isCacheVer(String url) {
        if (TextUtils.isEmpty(url)) return false;
        return url.startsWith("http://") && url.contains("cachevers");
    }

    public static String createCacheversUrl(String url) {
        int end = url.indexOf("?");
        final String fullUrl = url.substring(0, end);//拦截的全地址
        String version = UrlUtils.getUrlParam(url, "cachevers");
        String requestUrl = createAndroidUrl(fullUrl, version);
        return requestUrl;
    }

    private static String createAndroidUrl(String url, String version) {
        return version + "." + url.substring(7);
    }

    public static String createCacheversFile(String url) {
        return url + ".cachevers";
    }


    public static String getType(String path) {
        String type = "text/html";
        if (!TextUtils.isEmpty(path)) {
            if (path.endsWith(".css")) {
                type = "text/css";
            } else if (path.endsWith(".js")) {
                type = "text/javascript";
            } else if (path.endsWith(".png")) {
                type = "image/jpeg";
            }
        }
        return type;
    }

    /**
     * 判断是否html模板而不是css,js,或图片
     *
     * @param url
     * @return
     */
    public static boolean isHtmlEnd(String url) {
        String regex = "\\w+\\.(css|js|png|png1|jpg|gif)$";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(url);
        return m.find();
    }

    /**
     * 获取url的全部参数
     *
     * @param url
     * @return
     */
    public static String getQueryString(String url) {
        if (TextUtils.isEmpty(url)) {
            return "";
        }
        int index = url.indexOf("?");
        if (index > 0) {
            return url.substring(index + 1, url.length());
        } else {
            return "";
        }

    }

    public static String getRealAuthority(String authority) {
        if (authority == null) {
            return "";
        }

        int index = authority.indexOf(".");
        if (index < 0) {
            return authority;
        }
        String version = authority.substring(0, index);
        String real = authority.substring(version.length() + 1);
        return real;
    }

    @NotNull
    public static String nvl(@NotNull String url) {
        if (TextUtils.isEmpty(url)) return "";
        if (!url.contains("http")) {
            url = "http://" + url;
        }
        return url;
    }
}
